package Controllers;

import Configs.Config;
import GUIs.f_nhanvien_chunhatro_nhatro_sua;
import GUIs.f_nhanvien_chunhatro_nhatro_them;
import com.db4o.ObjectContainer;
import com.db4o.ObjectSet;
import com.db4o.query.Predicate;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import models.ChuNhaTro;
import models.DiaChi;
import models.NhaTro;

public class NhaTroController {

    private final Config conn;
    private BieuThucChinhQuy btcq;
    private MyTableFormat myFormat;

    public NhaTroController(Config conn) {
        this.conn = conn;
    }

    public NhaTro getNhaTroWithGPKD(String sogpdkkd) {
        ObjectContainer db = this.conn.getConn();
        return db.query(new Predicate<NhaTro>() {
            @Override
            public boolean match(NhaTro nhanvien) {
                return (nhanvien.getGPKD().equals(sogpdkkd));
            }
        }).next();
    }

    public void Show(JTable tbdsNhaTro, String txttim, String cmndChuNhaTro) {
        this.myFormat = new MyTableFormat();
        DefaultTableModel model = (DefaultTableModel) tbdsNhaTro.getModel();
        if (txttim == null) {
            ObjectSet<NhaTro> nhaTros = this.conn.getConn().query(new Predicate<NhaTro>() {
                @Override
                public boolean match(NhaTro et) {
                    return et.getChunhatro().getCMND().equals(cmndChuNhaTro) && !et.getIsDel();
                }
            });
            int stt = 0;
            for (NhaTro nhaTro : nhaTros) {
                Object[] row = {++stt, nhaTro.getGPKD(), nhaTro.getTennhatro()};
                model.addRow(row);
            }
        } else {
    
            ObjectSet<NhaTro> nhaTros = this.conn.getConn().query(new Predicate<NhaTro>() {
                @Override
                public boolean match(NhaTro et) {
                    return !et.getIsDel()
                            && et.getChunhatro().getCMND().equals(cmndChuNhaTro)
                            && (XuLyChuoi.similarity(txttim, et.getGPKD()) > 0.2 || XuLyChuoi.similarity(txttim, et.getTennhatro()) > 0.2);
                }
            });
            int stt = 0;
            for (NhaTro nhaTro : nhaTros) {
                Object[] row = {++stt, nhaTro.getGPKD(), nhaTro.getTennhatro()};
                model.addRow(row);
            }
        }
        this.myFormat.resizeFitRows(tbdsNhaTro);
    }

    public boolean Add(f_nhanvien_chunhatro_nhatro_them nhatro_them) {
        String gpdkkd = nhatro_them.tfsogpdk.getText().trim();
        String tennhatro = XuLyChuoi.inHoaChuDauChuoi(nhatro_them.tftennhatro.getText());
        String mota = nhatro_them.textareamota.getText().trim();
        String sdt = nhatro_them.tfsdt.getText().trim();
        String sonha = nhatro_them.tfsonha.getText().trim();
        String hem = nhatro_them.tfhem.getText().trim();
        String duong = XuLyChuoi.inHoaChuDauChuoi(nhatro_them.tfduong.getText());
        String quanhuyen = XuLyChuoi.inHoaChuDauChuoi(nhatro_them.tfquanhuyen.getText());
        String tinhtp = XuLyChuoi.inHoaChuDauChuoi(nhatro_them.tftinh.getText());

        this.btcq = new BieuThucChinhQuy(gpdkkd, "^[0-9]{9,15}$");
        if (!this.btcq.isBoolean()) {
            JOptionPane.showMessageDialog(nhatro_them, "Số giấy phép đăng ký kinh doanh không hợp lệ.\nCảnh báo: Số GPĐKKD chỉ chứa các ký tự số [0-9] dài trong khoảng [9-15] ký tự.", "Thông báo", JOptionPane.ERROR_MESSAGE);
            nhatro_them.tfsogpdk.requestFocus();
        } else {
            this.btcq.setBtchinhquy("[^!@#$%^&*\\{\\}\\\\'\\\"]+$");
            this.btcq.setChuoikt(tennhatro);
            if (!this.btcq.isBoolean()) {
                JOptionPane.showMessageDialog(nhatro_them, "Tên nhà trọ không hợp lệ.", "Thông báo", JOptionPane.ERROR_MESSAGE);
                nhatro_them.tftennhatro.requestFocus();
            } else {
                this.btcq.setChuoikt(mota);
                if (!this.btcq.isBoolean()) {
                    JOptionPane.showMessageDialog(nhatro_them, "Mô tả nhà trọ không hợp lệ.", "Thông báo", JOptionPane.ERROR_MESSAGE);
                    nhatro_them.textareamota.requestFocus();
                } else {
                    this.btcq.setBtchinhquy("^[0-9]{9,15}$");
                    this.btcq.setChuoikt(sdt);
                    if (!this.btcq.isBoolean()) {
                        JOptionPane.showMessageDialog(nhatro_them, "Số điện thoại không hợp lệ.", "Thông báo", JOptionPane.ERROR_MESSAGE);
                        nhatro_them.tfsdt.requestFocus();
                    } else {
                        this.btcq.setBtchinhquy("^[A-Za-z0-9]{1,10}$");
                        this.btcq.setChuoikt(sonha);
                        if (!this.btcq.isBoolean()) {
                            JOptionPane.showMessageDialog(nhatro_them, "Số nhà không hợp lệ.", "Thông báo", JOptionPane.ERROR_MESSAGE);
                            nhatro_them.tfsonha.requestFocus();
                        } else {
                            this.btcq.setBtchinhquy("[^!@#$%^&*\\{\\}\\\\'\\\"]+$");
                            this.btcq.setChuoikt(hem);
                            if (!this.btcq.isBoolean()) {
                                JOptionPane.showMessageDialog(nhatro_them, "Hẻm không hợp lệ.", "Thông báo", JOptionPane.ERROR_MESSAGE);
                                nhatro_them.tfhem.requestFocus();
                            } else {
                                this.btcq.setBtchinhquy("[^!@#$%^&*\\{\\}\\\\'\\\"]+$");
                                this.btcq.setChuoikt(duong);
                                if (!this.btcq.isBoolean()) {
                                    JOptionPane.showMessageDialog(nhatro_them, "Đường không hợp lệ.", "Thông báo", JOptionPane.ERROR_MESSAGE);
                                    nhatro_them.tfduong.requestFocus();
                                } else {
                                    this.btcq.setBtchinhquy("[^!@#$%^&*\\{\\}\\\\'\\\"]+$");
                                    this.btcq.setChuoikt(quanhuyen);
                                    if (!this.btcq.isBoolean()) {
                                        JOptionPane.showMessageDialog(nhatro_them, "Quận huyện không hợp lệ.", "Thông báo", JOptionPane.ERROR_MESSAGE);
                                        nhatro_them.tfquanhuyen.requestFocus();
                                    } else {
                                        this.btcq.setBtchinhquy("[^!@#$%^&*\\{\\}\\\\'\\\"]+$");
                                        this.btcq.setChuoikt(tinhtp);
                                        if (!this.btcq.isBoolean()) {
                                            JOptionPane.showMessageDialog(nhatro_them, "Tỉnh thành phố không hợp lệ.", "Thông báo", JOptionPane.ERROR_MESSAGE);
                                            nhatro_them.tftinh.requestFocus();
                                        } else {
                                            ObjectSet<NhaTro> conflicts = this.conn.getConn().query(new Predicate<NhaTro>() {
                                                @Override
                                                public boolean match(NhaTro et) {
                                                    return et.getGPKD().equals(gpdkkd);
                                                }
                                            });

                                            if (conflicts.size() == 0) {
                                                ChuNhaTro chuNhaTro = this.conn.getConn().query(new Predicate<ChuNhaTro>() {
                                                    @Override
                                                    public boolean match(ChuNhaTro et) {
                                                        return et.getCMND().equals(nhatro_them.cmndChuNhaTro);
                                                    }
                                                }).next();
                                                NhaTro themmoi = new NhaTro(gpdkkd, tennhatro, mota, sdt);
                                                DiaChi dc = new DiaChi(sonha, hem, duong, quanhuyen, tinhtp);
                                                themmoi.setDiachi(dc);
                                                themmoi.setChunhatro(chuNhaTro);
                                                chuNhaTro.addNhaTro(themmoi);
                                                this.conn.getConn().store(themmoi);
                                                return true;
                                            } else {
                                                JOptionPane.showMessageDialog(nhatro_them, "Nhà trọ này đã có trong CSDL vui lòng nhập lại số GPĐKKD.", "Thông báo", JOptionPane.ERROR_MESSAGE);
                                                nhatro_them.tfsogpdk.requestFocus();
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        return false;
    }

    public boolean Edit(f_nhanvien_chunhatro_nhatro_sua sua_nhatro) {
        //String gpdkkd = sua_nhatro.tfsogpdk.getText().trim();
        String tennhatro = XuLyChuoi.inHoaChuDauChuoi(sua_nhatro.tftennhatro.getText());
        String mota = sua_nhatro.tamota.getText().trim();
        String sdt = sua_nhatro.tfsdt.getText().trim();
        String sonha = sua_nhatro.tfsonha.getText().trim();
        String hem = sua_nhatro.tfhem.getText().trim();
        String duong = XuLyChuoi.inHoaChuDauChuoi(sua_nhatro.tfduong.getText());
        String quanhuyen = XuLyChuoi.inHoaChuDauChuoi(sua_nhatro.tfquanhuyen.getText());
        String tinhtp = XuLyChuoi.inHoaChuDauChuoi(sua_nhatro.tftinh.getText());

        this.btcq = new BieuThucChinhQuy(tennhatro, "[^!@#$%^&*\\{\\}\\\\'\\\"]+$");
            if (!this.btcq.isBoolean()) {
                JOptionPane.showMessageDialog(sua_nhatro, "Tên nhà trọ không hợp lệ.", "Thông báo", JOptionPane.ERROR_MESSAGE);
                sua_nhatro.tftennhatro.requestFocus();
            } else {
                this.btcq.setChuoikt(mota);
                if (!this.btcq.isBoolean()) {
                    JOptionPane.showMessageDialog(sua_nhatro, "Mô tả nhà trọ không hợp lệ.", "Thông báo", JOptionPane.ERROR_MESSAGE);
                    sua_nhatro.tamota.requestFocus();
                } else {
                    this.btcq.setBtchinhquy("^[0-9]{9,15}$");
                    this.btcq.setChuoikt(sdt);
                    if (!this.btcq.isBoolean()) {
                        JOptionPane.showMessageDialog(sua_nhatro, "Số điện thoại không hợp lệ.", "Thông báo", JOptionPane.ERROR_MESSAGE);
                        sua_nhatro.tfsdt.requestFocus();
                    } else {
                        this.btcq.setBtchinhquy("^[A-Za-z0-9]{1,10}$");
                        this.btcq.setChuoikt(sonha);
                        if (!this.btcq.isBoolean()) {
                            JOptionPane.showMessageDialog(sua_nhatro, "Số nhà không hợp lệ.", "Thông báo", JOptionPane.ERROR_MESSAGE);
                            sua_nhatro.tfsonha.requestFocus();
                        } else {
                            this.btcq.setBtchinhquy("[^!@#$%^&*\\{\\}\\\\'\\\"]+$");
                            this.btcq.setChuoikt(hem);
                            if (!this.btcq.isBoolean()) {
                                JOptionPane.showMessageDialog(sua_nhatro, "Hẻm không hợp lệ.", "Thông báo", JOptionPane.ERROR_MESSAGE);
                                sua_nhatro.tfhem.requestFocus();
                            } else {
                                this.btcq.setBtchinhquy("[^!@#$%^&*\\{\\}\\\\'\\\"]+$");
                                this.btcq.setChuoikt(duong);
                                if (!this.btcq.isBoolean()) {
                                    JOptionPane.showMessageDialog(sua_nhatro, "Đường không hợp lệ.", "Thông báo", JOptionPane.ERROR_MESSAGE);
                                    sua_nhatro.tfduong.requestFocus();
                                } else {
                                    this.btcq.setBtchinhquy("[^!@#$%^&*\\{\\}\\\\'\\\"]+$");
                                    this.btcq.setChuoikt(quanhuyen);
                                    if (!this.btcq.isBoolean()) {
                                        JOptionPane.showMessageDialog(sua_nhatro, "Quận huyện không hợp lệ.", "Thông báo", JOptionPane.ERROR_MESSAGE);
                                        sua_nhatro.tfquanhuyen.requestFocus();
                                    } else {
                                        this.btcq.setBtchinhquy("[^!@#$%^&*\\{\\}\\\\'\\\"]+$");
                                        this.btcq.setChuoikt(tinhtp);
                                        if (!this.btcq.isBoolean()) {
                                            JOptionPane.showMessageDialog(sua_nhatro, "Tỉnh thành phố không hợp lệ.", "Thông báo", JOptionPane.ERROR_MESSAGE);
                                            sua_nhatro.tftinh.requestFocus();
                                        } else {
                                                NhaTro nhaTroLuu = this.conn.getConn().query(new Predicate<NhaTro>() {
                                                    @Override
                                                    public boolean match(NhaTro et) {
                                                        return et.getGPKD().equals(sua_nhatro.nhaTroSua.getGPKD());
                                                    }
                                                }).next();
                                                nhaTroLuu.setTennhatro(tennhatro);
                                                nhaTroLuu.setMotanhatro(mota);
                                                nhaTroLuu.setSdt(sdt);
                                                DiaChi dc = new DiaChi(sonha, hem, duong, quanhuyen, tinhtp);
                                                nhaTroLuu.setDiachi(dc);
                                                this.conn.getConn().store(nhaTroLuu);
                                                return true; 
                                        }
                                    }
                                }
                            }
                    }
                }
            }
        }
        return false;
    }

    public boolean Delete(String sogpkd) {
        ObjectSet<NhaTro> xoa = this.conn.getConn().query(new Predicate<NhaTro>() {
            @Override
            public boolean match(NhaTro et) {
                return et.getGPKD().equals(sogpkd);
            }
        });

        while (xoa.hasNext()) {
            NhaTro nhaTro = xoa.next();
            if (nhaTro.getDsphongtro().isEmpty()) {
                nhaTro.getChunhatro().removeNhaTro(nhaTro);
                this.conn.getConn().delete(nhaTro);
            } else {
                nhaTro.setIsDel(true);
                this.conn.getConn().store(nhaTro);
            }
        }
        return true;
    }

}
